#include <iostream>
#include <thread>
#include <future>
#include <chrono>

/**
 * 异步加法任务
 * @param num1 第一个加数
 * @param num2 第二个加数
 * @param prom 用于设置结果的promise对象
 */
void Add(int num1, int num2, std::promise<int> &prom) {
    // 模拟耗时操作（如网络请求、文件读写）
    std::this_thread::sleep_for(std::chrono::seconds(3));
    
    // 设置promise的值，该值可被对应的future获取
    prom.set_value(num1 + num2);
}

int main()
{
    // 1. 创建promise对象 - 用于异步设置结果
    std::promise<int> prom;

    // 2. 获取与promise关联的future对象 - 用于获取异步结果
    std::future<int> fu = prom.get_future();

    // 3. 创建线程并执行异步任务
    // 将promise通过引用传递给线程函数
    std::thread thr(Add, 11, 22, std::ref(prom));

    // 4. 阻塞等待异步结果
    // future::get()会阻塞直到promise设置了值
    int res = fu.get();
    
    // 5. 输出结果
    std::cout << "sum: " << res << std::endl;

    // 6. 等待线程完成（必须join或detach）
    thr.join();

    return 0;
}    